#ifndef STATUSCODE_H
#define STATUSCODE_H 1

#include <string>
#include <iostream>
#include <vector>

class FlotMessage;

/**
 * Cette classe permet d'avoir des valeurs de retour plus évoluées
 * pour une fonction qu'un simple bool.
 *
 * On peut tester un StatusCode exactement comme un bool, mais il
 * contient une (plusieurs) valeur(s) de retour (Valeur) et un code
 * qui peut être utilisé pour le traitement d'erreur. Une string
 * (Message) peut egalement être joint.
 *
 * La convention est d'utiliser un code négatif lorsque l'erreur doit
 * provoquer un arrêt prématuré du programme. Le même code peut
 * exister sous une forme positive et négative, il n'y a pas de
 * restriction.
 *
 * Les codes d'erreurs prédéfinis occupent les plages suivantes :\n
 * - \f$ \left[ 0, 99 \right ] \f$ erreurs générales,\n
 * - \f$ \left[ 100, 199 \right ] \f$ erreurs liées à la lecture d'un
 *    fichier XML.\n
 * - \f$ \left[ 200, 299 \right ] \f$ erreurs liées à la récupérations
 *   d'informations depuis le Parser.
 * - \f$ \left[ 300, 399 \right ] \f$ erreurs liées à la gestion des
 *    classes.\n
 *
 * 
 * 
 * @author Johan "Solo" Luisier
 */
class StatusCode
{
 public:
  StatusCode(const bool& etat = true, const int& val = 0, const int& code = 0,
	     const std::string& message = "");
  StatusCode(const bool& etat,  const std::vector< int >& val,
	     const int& code = 0, const std::string& message = "");
  StatusCode(const StatusCode& sc);
  virtual ~StatusCode();
  operator bool() const;
  operator int() const;
  /**
   * Permet de réaliser un affichage simple d'un StatusCode.
   *
   * @param os flot de sortie.
   * @param sc StatusCode à afficher.
   *
   * @return le flot de sortie modifié.
   */
  friend std::ostream& operator<<(std::ostream& os, const StatusCode& sc);
  /**
   * Permet de réaliser un affichage simple d'un StatusCode.
   *
   * @param flot instance de FlotMessage dans laquelle on veut écrire.
   * @param sc StatusCode à afficher.
   *
   * @return le flot de sortie modifié.
   */
  friend FlotMessage& operator<<(FlotMessage& flot, const StatusCode& sc);
  void afficher() const;

  const bool& etat() const;
  const int& valeur(const unsigned& num = -1u) const;
  const int& code() const;
  const std::string& message() const;
  unsigned nombre() const;

  void setEtat( const bool& etat );
  void setValeur( const int& valeur, const unsigned& num = -1u );
  void setValeurs( const std::vector< int >& valeurs );
  unsigned ajoutValeur( const int& valeur );
  void setCode( const int& code );
  void setMessage( const std::string& message );
 protected:
  /**
   * Reflète l'état Succès (\e true) ou Echec (\e false).
   */
  bool Etat;
 /**
  * Valeur de retour supplémentaire.
  */
  std::vector< int > Valeurs;
  /**
   * Code d'erreur lors d'un échec.
   */
  int  Code;
  /**
   * Permet de stocker un message lors de l'émission d'une erreur
   * notament.
   */
  std::string Message;
};

#endif // STATUSCODE_H
